package cl.zeke.cursos.jsf2spring3jpa2.negocio.entities;

import cl.zeke.java.commons.beansvalidators.annotations.Email;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity; 
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;

@Entity
@Table(name="usuario")
@NamedQueries({
    @NamedQuery(name="Usuario.traerTodos", 
        query="select u from Usuario u "
        + "order by u.apellidos asc, u.nombres asc"),
    @NamedQuery(name="Usuario.traerPorRut", 
        query="select distinct u from Usuario u "
        + "inner join fetch u.perfil p "
        + "where u.rut = :rut"),
    @NamedQuery(name="Usuario.traerPorEmail", 
        query="select u from Usuario u "
        + "where u.email = :email")
})
public class Usuario implements Serializable {

    @Id
    @Column(name="rut")
    private Integer rut;
    
    @Size(max = 250)
    @Column(name="nombres")
    private String nombres;
    
    @Size(max = 250)
    @Column(name="apellidos")
    private String apellidos;
    
    @Column(name="password")
    private String password;
    
    @Past
    @Temporal(TemporalType.DATE)
    @Column(name="fecha_nacimiento")
    private Date fechaNacimiento;
    
    @Email
    private String email;
    
    @JoinColumn(name = "perfil_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Perfil perfil;
    
    private Boolean habilitado;
    
    @Transient
    public String getNombreCompleto() {
        return nombres + " " + apellidos;
    }
    
    public Integer getRut() {
        return rut;
    }

    public void setRut(Integer rut) {
        this.rut = rut;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }
    
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

    public Boolean getHabilitado() {
        return habilitado;
    }

    public void setHabilitado(Boolean habilitado) {
        this.habilitado = habilitado;
    }
    
    @Override
    public int hashCode() {
        int hash = 3;
        hash = 19 * hash + (this.rut != null ? this.rut.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.rut != other.rut && (this.rut == null || !this.rut.equals(other.rut))) {
            return false;
        }
        return true;
    }

}